package com.exampleyyy.demoyyy.GuoLv;
import com.alibaba.fastjson.JSON;
import com.exampleyyy.demoyyy.common.R;

import javax.servlet.*;
// 正确的过滤器导入
// import java.util.logging.Filter;
// 错误的过滤器导入
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.regex.Pattern;

import  com.exampleyyy.demoyyy.common.BaseContext;
import lombok.extern.slf4j.Slf4j;

//网页过滤器   filterName 过滤器的名字 urlPatterns 限制过滤范围  / 代表8.130.48.71:8081后面的第一个斜杠
// * 代表所有路由
@WebFilter(filterName="neidianziGuoLV",urlPatterns = "/*")
@Slf4j
public class logincheckGuolv  implements Filter {
    // 1.普通类变成过滤器类 ,implements 生效  Filter 过滤器
    // 2.划定范围,白名单,在白名单中的路由或者接口,直接放行到控制层,不需要验证
    String[] BaiMingDan = new String[]{ // 外部路由或者接口,直接放行
            "/employee/login",
            "/employee/logout",
            "/backend/.*?",
            "/front/.*?",
            "/user/sendMsg",
            "/user/login",
            "/common/.*?",
            "/category/list",
            "/dish/list",
            "/",  // 过滤器放行 /
            "/admin",  // 过滤器放行 /admin
            "/wxapi/login",
            "/wxapi/wxpay"

    };

    @Override //重写过滤器函数
    public  void  doFilter(ServletRequest QingQiu,
       ServletResponse XiangYing, FilterChain FangXing)
        throws IOException, ServletException {
        // 参数1. 请求参数ServletRequest类型  参数名 QingQiu
        // 参数2. 响应参数ServletResponse类型 参数名 XiangYing
        // 参数3. 放行参数FilterChain类型     参数名 FangXing
        //1.判断来的这个请求接口，在不在白名单中，在白名单中，直接放行，放行到控制层
        //1.1 通过请求对象获取请求接口,构建请求对象,构建响应对象
        HttpServletRequest  request = (HttpServletRequest) QingQiu;
        HttpServletResponse response = (HttpServletResponse) XiangYing;
        String realURI = request.getRequestURI();
        //2.循环白名单,将白名单中的每一个元素,与 获取的URI地址对比
        for( String meiyige:BaiMingDan){
            // 用正则表达式去匹配Pattern.matches
             boolean  result = Pattern.matches(meiyige,realURI);
             if(result){
                 // 如果结果为真,说明在白名单中,放行到控制层
                 FangXing.doFilter(request,response);
                 System.out.println("这个地址是放行地址,在白名单中"+realURI);
                 return;
             }
        }
        // 3.如果不在白名单,那么员工需要检查是否处于登录状态
        if(request.getSession().getAttribute("员工信息id")!=null){
            //如果有session,说明处于登录状态,放行
            System.out.println("这个地址是不在白名单中,处于登录状态,放行"+realURI);
            Long empId = (Long) request.getSession().getAttribute("员工信息id");
            // 使用公共工具类,将session的id值偷来
            BaseContext.setCurrentId(empId);
            FangXing.doFilter(request,response);
            return;
        }
        // 4. 判断用户登录状态，如果已登录，则直接放行
        if (request.getSession().getAttribute("用户信息id") != null) {
            log.info("用户已经登录，用户id为：{}", request.getSession().getAttribute("用户信息id"));
            //将id存入线程变量a
            Long userId = (Long) request.getSession().getAttribute("用户信息id");
            BaseContext.setCurrentId(userId);
            FangXing.doFilter(request, response);
            return;
        }

        // 否则,你就是没有处于登录状态,返回一个错误
        System.out.println("这个地址是不在白名单中,且不处于登录状态,不放行,打回"+realURI);
        response.getWriter().write(JSON.toJSONString(R.error(0,"notlogin",null)));
        return;
        }


}
